package com.cuz.daileetcode;


/*****
 * 规定1和A对应、2和B对应、3和C对应...26和Z对应，
 * 那么一个数字字符串比如"111”就可以转化为:"AAA"、"KA"和"AK"。
 * 给定一个只有数字字符组成的字符串str，请问有多少种转化结果？
 */
public class Day38_1 {

    public static int num(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        return process(str.toCharArray(), 0);
    }

    private static int process(char[] chars, int index) {
        //如果当前的字符为0 那么返回0 因为之前的决策不对
        //比如 101 不能让第一个1转换为a 因为后续的0无法转换
        //只能让 1和0 转换为10对应的字母
        if (chars[index] == 0) {
            return 0;
        }
        //如果是最后一个 那么最后一个没得选择，前面的选择成立 返回1
        if (index == chars.length - 1) {
            return 1;
        }
        //如果是 那么 可以做两种选择
        //1自己转换为字母 然后 后面的继续转换
        //1和接下来的一起转换 然后继续转换
        if (chars[index] == '1') {
            int res = process(chars, index + 1);
            //如果不越 不是最后一个
            if (index + 1 < chars.length) {
                //当前这个1 和后面的一起转 接下来就是1+2
                res = res + process(chars, index + 2);
            }
            return res;
        }
        //如果是2 要考虑 自己转
        // 后面的字符大于’0‘小于’6‘（这样位于20——26）才可以做决策-》和后面的字母一起转
        if (chars[index] == '2') {
            int res = process(chars, index + 1);
            if (index + 1 < chars.length) {
                if (chars[index + 1] <= '6' && chars[index + 1] >= '0') {
                    res = res + process(chars, index + 2);
                }
            }
            return res;
        }
        return process(chars, index + 1);
    }
}
